<?php

/**
 * contacto actions.
 *
 * @package    ACATEC
 * @subpackage contacto
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class contactoActions extends sfActions
{
  public function executeIndex(sfWebRequest $request)
  {

  	$this->getUser()->setAttribute('current','contacto');

    /* Creamos la consulta para obtener el idempresa, como solo hay una cojo la primera.
     * no tengo en consideración que esté relacionado con el nombre de usuario    
     */
    $q = Doctrine_Query::create()
            ->select('id')
            ->from('Empresa id');          
    $empresa_id = $q->fetchOne(array(), Doctrine_Core::HYDRATE_ARRAY);
    
    // Y el resultado lo guardamos en la vble de sesión.
    $this->getUser()->setAttribute('empresa_id', $empresa_id['id']);

    // Definimos la cultura del usuario por defecto
    //$this->getUser()->setCulture(sfConfig::get('app_culture_default','es'));
    $this->getUser()->setCulture('es');

    // sorting
    if ($request->getParameter('sort') && $this->isValidSortColumn($request->getParameter('sort')))
    {
      $this->setSort(array($request->getParameter('sort'), $request->getParameter('sort_type')));
    }

    // pager
    if ($request->getParameter('page'))
    {
      $this->setPage($request->getParameter('page'));
    }
    $this->pager = $this->getPager();
    $this->sort = $this->getSort();
    
    //Intento para filtros con formularios embebidos de synofony
    //$this->filter = new ContactoFormFilter();
    //$this->contactos = $this->getRoute()->getObjects();    
    
  }

  public function executeFilter(sfWebRequest $request)
  {
    $this->setPage(1);

    if ($request->hasParameter('_reset'))
    {
      $this->setFilters(array());

      $this->redirect('@contacto');
    }

    $this->filters = new ContactoFormFilter($this->getFilters());

    $this->filters->bind($request->getParameter($this->filters->getName()));
    if ($this->filters->isValid())
    {
      $filters = $this->filters->getValues();
      $this->setFilters($filters);

      $this->redirect('@contacto');
    }

    $this->pager = $this->getPager();
    $this->sort = $this->getSort();

    $this->setTemplate('index');
  }
  
  public function executeActualizaBusquedaClienteId(sfWebRequest $request){
     $cliente_id=$request->getParameter('cliente_id');
     $this->cliente = Doctrine_Core::getTable('Contacto')->findOneById($cliente_id);
     
     $this->filters = new ContactoFormFilter($this->getFilters());
     $this->filters->bind($request->getParameter($this->filters->getName()));
     if ($this->filters->isValid())
     {
       $filters = $this->filters->getValues();
       $this->setFilters($filters);

     }
  }  
  
  public function executeNew(sfWebRequest $request)
  {
    /** NOTA DE MEJORA
  	    *****************************************************************************************
  	 En el modulo de inicio se inicializan las vbles de sesión.
  	 Debería controlarse de algún modo que estas vbles hayan sido creadas al llegar a este punto
  	 puesto que puede que el usuario no haya pasado por el punto inicial. **/

  	//$empresa_id = $this->getUser()->getAttribute('empresa_id');
  	// Coloco esto de momento porque no coge la variable de usuario
  	//$empresa_id = 1; //BORRAR *************************************** EN FUTURAS VERSIONES
        $this->form = new ContactoForm();
        // Cambiamos el campo empresa_id, lo debo hacer aquí y no en /form puesto que depende de vbles de sesión
        //$this->form->setWidget('empresa_id', new sfWidgetFormInputHidden(array('default' => $empresa_id)));
        //$this->form->setWidget('publico', new sfWidgetFormInputCheckbox(array('value_attribute_value' => '1',
        //'default' => true)));
        //$this->form->setWidget('empresa_cli_id', new sfWidgetFormInputHidden(array('default' => $empresa_id)));
        
               
	// Debo utilizar estos objetos
	$this->cliente = new Contacto();

    //unset($this->form['propietario_id']);

    /*
    $this->form->setWidget('empresa_cli_id',  new sfWidgetFormDoctrineChoice(array(
                          'model' =>  'CrmEmpresaCli'    )));
    $this->form->setWidget('contacto_categoria_id',  new sfWidgetFormDoctrineChoice(array(
                          'model' =>  'ContactoCategoria'    )));
    $tis->form->setWidget('publico', new sfWidgetFormInputCheckbox(array('value_attribute_value' => '1', 'default' => true)));
    */
    //$this->getUser()->setAttribute('crm_cliente',$this->cliente);

  }

  public function executeCreate(sfWebRequest $request)
  {
    $this->forward404Unless($request->isMethod(sfRequest::POST));
    //$empresa_id = $this->getUser()->getAttribute('empresa_id');
    $this->form = new ContactoForm();

	// Cambiamos el campo empresa_id
    //$this->form->setWidget('empresa_id', new sfWidgetFormInputHidden(array('default' => '1')));
    //$this->form->setWidget('empresa_id', new sfWidgetFormInputHidden(array('default' => $empresa_id)));
    //$this->form->setWidget('publico', new sfWidgetFormInputCheckbox(array('value_attribute_value' => '1',
    //'default' => true)));
    //$this->form->setWidget('empresa_cli_id', new sfWidgetFormInputHidden(array('default' => $empresa_id)));

    $this->processForm($request, $this->form);

    $this->setTemplate('new');
  }


  public function executeEdit(sfWebRequest $request)
  {
    $this->forward404Unless($contacto = Doctrine_Core::getTable('Contacto')->find(array($request->getParameter('id'))), sprintf('Object contacto does not exist (%s).', $request->getParameter('id')));

   // $empresa_id = $this->getUser()->getAttribute('empresa_id');
    // Coloco esto de momento porque no coge la variable de usuario
    //$empresa_id = 1; //BORRAR *************************************** EN FUTURAS VERSIONES
    $this->form = new ContactoForm($contacto);
    // Cambiamos el campo empresa_id
    //$this->form->setWidget('empresa_id', new sfWidgetFormInputHidden(array('default' => $empresa_id)));
    //$this->form->setWidget('publico', new sfWidgetFormInputCheckbox(array('value_attribute_value' => '1',
    //'default' => true)));
    //$this->form->setWidget('empresa_cli_id', new sfWidgetFormInputHidden(array('default' => $empresa_id)));
    
    // Si ya se han creado facturas no se podrá modificar el CIF del cliente.
    //if ($this->tieneFacturas($contacto)){
      //   $this->form->setWidget('dni', new sfWidgetFormInput(array('default' => $contacto->getDNI()),array('readonly'=>'readonly')));
    //}
    

  }
  
      

  public function executeShow(sfWebRequest $request)
  {
    $this->forward404Unless($contacto = Doctrine_Core::getTable('Contacto')->find(array($request->getParameter('id'))), sprintf('Object contacto does not exist (%s).', $request->getParameter('id')));
    $this->cliente = $contacto;

  }
/*
  public function executeShowCars(sfWebRequest $request)
  {
    $this->forward404Unless($contacto = Doctrine_Core::getTable('Contacto')->find(array($request->getParameter('id'))), sprintf('Object contacto does not exist (%s).', $request->getParameter('id')));
    //$this->coches = $contacto->getCrmVehiculo();
    
    //Muestro solo aquellos vehiculos del cliente que no están marcados como borrados.
    $borrado = 1;
    $this->coches = Doctrine_Core::getTable('CrmVehiculo')->createQuery('p')->where('p.remove_it <> ? OR p.remove_it IS NULL',$borrado)
            ->andWhere('p.cliente_id = ?',$request->getParameter('id'))
            ->execute();
    
    // sorting
    if ($request->getParameter('sort') && $this->isValidSortColumn($request->getParameter('sort')))
    {
      $this->setSort(array($request->getParameter('sort'), $request->getParameter('sort_type')));
    }

    // pager
    if ($request->getParameter('page'))
    {
      $this->setPage($request->getParameter('page'));
    }
    $this->pager = $this->getPager();
    $this->sort = $this->getSort();
  }
*/
  public function executeUpdate(sfWebRequest $request)
  {
    
    $this->forward404Unless($request->isMethod(sfRequest::POST) || $request->isMethod(sfRequest::PUT));
    $this->forward404Unless($contacto = Doctrine_Core::getTable('Contacto')->find(array($request->getParameter('id'))), sprintf('Object contacto does not exist (%s).', $request->getParameter('id')));

    $this->form = new ContactoForm($contacto);
    
    $this->processForm($request, $this->form);
    
    $this->setTemplate('edit');
    
    
  }

// Método para agregar un telefono vacío en el formulario
  /*
   public function executeAddTelefono(sfWebRequest $request){
      $this->forward404unless($request->isXmlHttpRequest());
      $number = intval($request->getParameter("num"));

      $this->form = new ContactoForm();

      $this->form->addNewFields($number);

      return $this->renderPartial('addNew',array('form' => $this->form, 'number' => $number));
    }
*/
  
// Método para agregar un email vacío en el formulario
  /*
   public function executeAddEmail(sfWebRequest $request){
      $this->forward404unless($request->isXmlHttpRequest());
      $number = intval($request->getParameter("numE"));

      $this->form = new ContactoForm();

      $this->form->addNewFieldsE($number);

      return $this->renderPartial('addNewEmail',array('form' => $this->form, 'number' => $number));
    }
*/
    
  /*
   * Función que indica si un cliente tiene documentos asociados 
   */
  /*
  protected function tieneDocumentos(Contacto $cliente){
      return (($this->tienePartes($cliente)) || ($this->tienePresupuestos($cliente)) 
              || ($this->tieneFacturas($cliente)));
  }

  protected function tienePartes(Contacto $cliente){
      $idCliente = $cliente->getId();
      $q = Doctrine_Query::create()
            ->select('id')
            ->from('CrmParte c1')
            ->where('c1.cliente_id = ?',$idCliente);
      $documentos = $q->fetchOne(array(), Doctrine_Core::HYDRATE_SINGLE_SCALAR);
      return ($documentos != null);
  }
  
  protected function tienePresupuestos(Contacto $cliente){
      $idCliente = $cliente->getId();
      $q = Doctrine_Query::create()
            ->select('id')
            ->from('CrmPresupuesto c1')
            ->where('c1.cliente_id = ?',$idCliente);
      $documentos = $q->fetchOne(array(), Doctrine_Core::HYDRATE_SINGLE_SCALAR);
      return ($documentos != null);
  }
  
  protected function tieneFacturas(Contacto $cliente){
      $idCliente = $cliente->getId();
      $q = Doctrine_Query::create()
            ->select('id')
            ->from('CrmFactura c1')
            ->where('c1.cliente_id = ?',$idCliente);
      $documentos = $q->fetchOne(array(), Doctrine_Core::HYDRATE_SINGLE_SCALAR);
      return ($documentos != null);
  }
*/
  
  /*
   * Este método elimina un cliente, solo si este no tiene documentos asociados (partes, presupuestos o facturas)
   * En caso contrario, lo marca para que no se muestre, pero seguirá en la BD.
   */
  public function executeDelete(sfWebRequest $request)
  {
    $request->checkCSRFProtection();

    $this->forward404Unless($contacto = Doctrine_Core::getTable('Contacto')->find(array($request->getParameter('id'))), sprintf('Object contacto does not exist (%s).', $request->getParameter('id')));
    //Si eliminamos el contacto borramos sus notificaciones y lo activamos como borrado a el y a sus polizas
    $contacto->remove_it = TRUE;  
    $contacto->save();
    foreach ($contacto->getPolizas() as $poliza)
    {
            $poliza->remove_it = TRUE;  
            $poliza->save();
    }
    foreach ($contacto->getNotificacion() as $notificacion)
    {
            //$notificacion->remove_it = TRUE;  
            //$notificacion->save();
            $notificacion->delete();
    }
    
    
    $this->getUser()->setFlash('notice', sfContext::getInstance()->getI18n()->__('Cliente eliminado.'));
    $this->redirect('contacto/index');
  }

  public function executeImprimir(sfWebRequest $request)
  {
  	// Recogemos los datos del vehiculo
  	$this->forward404Unless($contacto = Doctrine_Core::getTable('Contacto')->find(array($request->getParameter('id'))), sprintf('Object crm_vehiculo does not exist (%s).', $request->getParameter('id')));
  	$contacto= $contacto;
  	              
        //Cargamos los datos del pdf
  	$config = sfTCPDFPluginConfigHandler::loadConfig();
  	// pdf object
  	$pdf = new sfTCPDF();
  	
  	// Variables para generar el documento pdf
  	$titulo = sfContext::getInstance()->getI18n()->__('Datos del Cliente'); 
  	$nombre= $contacto->getNombre().' '.$contacto->getPrimerApellido().' '.$contacto->getSegundoApellido().' '.$contacto->getNumDocumento();
  	$hoy = $this->getUser()->getAttribute('hoy','Lunes');
  	
  	$saltoEncabezado = PDF_HEADER_STRING; 
  	$nombre=strtoupper($nombre);
  	// set document information
  	$pdf->SetCreator(PDF_CREATOR);
  	$pdf->SetAuthor(PDF_AUTHOR);
  	$pdf->SetTitle($titulo);
  	$pdf->SetSubject($nombre);
  	$pdf->SetKeywords('acalio, innova, acatec, crm, desarrollo');
  	
  	
  	// set default header data
  	//$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 001', PDF_HEADER_STRING);
  	$pdf->SetHeaderData('../../../../../web/'.sfConfig::get('pdf_imagenlogo'), PDF_HEADER_LOGO_WIDTH, 
  	         $titulo, $nombre.$saltoEncabezado.$hoy);
  	
  	// set header and footer fonts
  	$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
  	$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
  	
  	// set default monospaced font
  	$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
  	
  	//set margins
  	$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
  	$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
  	$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
  	
  	//set auto page breaks
  	$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
  	
  	//set image scale factor
  	$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
  	
  	// ---------------------------------------------------------
  	
  	// set default font subsetting mode
  	$pdf->setFontSubsetting(true);
  	
  	// Set font
  	// dejavusans is a UTF-8 Unicode font, if you only need to
  	// print standard ASCII chars, you can use core fonts like
  	// helvetica or times to reduce file size.
  	$pdf->SetFont('dejavusans', '', 10, '', true);
    
  	// Add a page
  	// This method has several options, check the source code documentation for more information.
  	$pdf->AddPage();
  	
  	// Set some content to print
  	$html = $contacto->imprimeToPdf();
                
  	// Print text using writeHTMLCell()
  	$pdf->writeHTMLCell($w=0, $h=0, $x='', $y='', $html, $border=0, $ln=1, $fill=0, $reseth=true, $align='', $autopadding=true);
  	// ---------------------------------------------------------
  	
        // Modificación FEBRERO 2013
        // =====================================       
        //Cojo la lista de pólizas para imprimirlas        
        $polizas = $contacto->getPolizas();
        $poliza = $polizas->getFirst();  	        
        // Imprimo los datos de las polizas del cliente        
        $html = $poliza->imprimeTablaPolizasToPdf($polizas);
        
	$pdf->SetFont('dejavusans', '', 6, '', true);
  	// Print text using writeHTMLCell()
  	$pdf->writeHTMLCell($w=0, $h=0, $x='', $y='', $html, $border=0, $ln=1, $fill=0, $reseth=true, $align='', $autopadding=true);
  	
        // =====================================       
	
        
  	// Close and output PDF document
  	// This method has several options, check the source code documentation for more information.
  	$pdf->Output($nombre.'.pdf', 'I');
  	// Stop symfony process
  	throw new sfStopException();
  	
  }
  
  public function executeBatch(sfWebRequest $request)
  {
    $request->checkCSRFProtection();

    if (!$action = $request->getParameter('batch_action'))
    {
      $this->getUser()->setFlash('error', sfContext::getInstance()->getI18n()->__('You must select an action to execute on the selected items.'));

      $this->redirect('@contacto');
    }

    if (!$ids = $request->getParameter('ids'))
    {
      if (($action == 'batchPrint') || ($action == 'batchGrupo') || ($action == 'batchBajas'))  // Le hemos dado a imprimir pero sin seleccionar nada. IMPRIMIR TODO
      {
    		if (!method_exists($this, $method = 'execute'.ucfirst($action)))
    		{
      			throw new InvalidArgumentException(sprintf('You must create a "%s" method for action "%s"', $method, $action));
    		}
    		// execute batch executeBachPrint sin ids
      		$this->$method($request);
      }
      $this->getUser()->setFlash('error',sfContext::getInstance()->getI18n()->__('You must at least select one item.'));

      $this->redirect('@contacto');
    }

    if (!method_exists($this, $method = 'execute'.ucfirst($action)))
    {
      throw new InvalidArgumentException(sprintf('You must create a "%s" method for action "%s"', $method, $action));
    }


    $validator = new sfValidatorDoctrineChoice(array('multiple' => true, 'model' => 'Contacto'));
    try
    {
      // validate ids
      $ids = $validator->clean($ids);

      // execute batch
      $this->$method($request);
    }
    catch (sfValidatorError $e)
    {
      $this->getUser()->setFlash('error',sfContext::getInstance()->getI18n()->__('A problem occurs when deleting the selected items as some items do not exist anymore.'));
    }

    $this->redirect('@contacto');
  }
  
  protected function executeBatchDelete(sfWebRequest $request)
  {
    $ids = $request->getParameter('ids');

    $records = Doctrine_Query::create()
      ->from('Contacto')
      ->whereIn('id', $ids)
      ->execute();

    foreach ($records as $contacto)
    {
        //Si eliminamos el contacto borramos sus notificaciones y lo activamos como borrado a el y a sus polizas
        $contacto->remove_it = TRUE;  
        $contacto->save();
        foreach ($contacto->getPolizas() as $poliza)
        {
                $poliza->remove_it = TRUE;  
                $poliza->save();
        }
        foreach ($contacto->getNotificacion() as $notificacion)
        {
                //$notificacion->remove_it = TRUE;  
                //$notificacion->save();
                $notificacion->delete();
        }
    }

    $this->getUser()->setFlash('notice', sfContext::getInstance()->getI18n()->__('Los contactos marcados han sido eliminados.'));
    $this->redirect('@contacto');
  }
  
  protected function executeBatchPrint(sfWebRequest $request)
  {

	if (!$ids = $request->getParameter('ids')){  //imprimir sin ids imprime todo
                $this->getUser()->setAttribute('imprime',1);
		// Imprime los que pertenezcan al filtro
                $clientes = $this->buildQuery()->execute();                
                $this->getUser()->getAttributeHolder()->remove('imprime');
                
	} else {   // imprime solo los ids selecionados
                $q = Doctrine_Query::create()
                        ->select('nombre, primer_apellido,segundo_apellido,num_documento,tipo_via,
                                  direccion,num_via,resto_via,piso,puerta,escalera,portal,municipio,
                                  cod_postal,provincia,telefono,telefono2,email,sexo,idioma')
                        ->from('Contacto c1')
                        ->whereIn('c1.id',$ids);
                $clientes = $q->fetchArray(array(), Doctrine_Core::HYDRATE_ARRAY);
	}      
        
    	//Cargamos los datos del pdf
	$config = sfTCPDFPluginConfigHandler::loadConfig();
	// pdf object
	$pdf = new sfTCPDF();
	 
	// Variables para generar el documento pdf
	$titulo = sfContext::getInstance()->getI18n()->__('Lista de Clientes');
	$hoy = $this->getUser()->getAttribute('hoy','Lunes');
	 
	$saltoEncabezado = PDF_HEADER_STRING;
	// set document information
	$pdf->SetCreator(PDF_CREATOR);
	$pdf->SetAuthor(PDF_AUTHOR);
	$pdf->SetTitle($titulo);
	$pdf->SetSubject($titulo);
	$pdf->SetKeywords('acalio, innova, acatec, crm, desarrollo');
	 
	 
	// set default header data
	$pdf->SetHeaderData('../../../../../web/'.sfConfig::get('pdf_imagenlogo'), PDF_HEADER_LOGO_WIDTH,
	$titulo, $saltoEncabezado.$hoy);
	 
	// set header and footer fonts
	$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
	$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
	 
	// set default monospaced font
	$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
	 
	//set margins
	$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT,PDF_MARGIN_BOTTOM);
	$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
	$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
	 
	//set auto page breaks
	$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
	 
	//set image scale factor
	$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
	 
	// ---------------------------------------------------------
	 
	// set default font subsetting mode
	$pdf->setFontSubsetting(true);
	 
	// Set font
	// dejavusans is a UTF-8 Unicode font, if you only need to
	// print standard ASCII chars, you can use core fonts like
	// helvetica or times to reduce file size.
	$pdf->SetFont('dejavusans', '', 6, '', true);
	 
	//Calculo el número de páginas necesarias
        $maximo_pagina = sfConfig::get('app_impresion_max_filas_pagina');
        $numero_clientes = count($clientes);
        $paginas = $numero_clientes/$maximo_pagina;
        if (($numero_clientes%$maximo_pagina)!=0){ //Para la última página
            $paginas = $paginas +1;
        }
        //Voy imprimiendo cada bloque de clientes en una página
        for ($i =1; $i<=$paginas; $i++){
            // Add a page
            // This method has several options, check the source code documentation for more information.
            $pdf->AddPage();
            //Indico además de los clientes, la página por la que voy para que imprima los clientes que corresponden a ese bloque
            $html = $this->imprimeTablaClientesToPdf($clientes,$i);            
            // Print text using writeHTMLCell()
            $pdf->writeHTML($html, true, false, false, false, '');
            // ---------------------------------------------------------
        }
        
	// Close and output PDF document
	// This method has several options, check the source code documentation for more information.
	$pdf->Output($titulo.'.pdf', 'I');
	// Stop symfony process
	throw new sfStopException();
  }
  
   /*
   * Recoge los ids de los clientes y los asocia al grupo.
   */
   protected function executeBatchGrupo(sfWebRequest $request)
  {
    if (!$ids = $request->getParameter('ids')){  //grupo sin ids asigna todo
	// Imprime los que pertenezcan al filtro
        //$records = $this->buildQuery()->execute();
        $ids = NULL; 
    }     
    //Guardo los ids en sesión
    $this->getUser()->setAttribute('seleccion_grupos',$ids);
    $this->redirect('contacto/asignarGrupo');
  }
  
  /*
   * Muestra los clientes que tienen todas sus pólizas de baja
   * 
     SELECT * FROM `contacto` c WHERE c.`id` IN (
	SELECT pc.`contacto_id` FROM `poliza_contacto` pc, `poliza` p WHERE 
		pc.`poliza_id` = p.`id` AND p.`estado` = "baja" GROUP BY pc.`contacto_id` 
			HAVING COUNT(p.`id`) = (SELECT COUNT(p.`id`) FROM `poliza_contacto` pc, `poliza` p WHERE 
                            pc.`poliza_id` = p.`id` AND pc.`contacto_id`=c.`id` ))
   * 
   */
   protected function executeBatchBajas(sfWebRequest $request)
  {
        //Creamos la consulta para obtener los clientes que tienen todas sus pólizas de baja
        /* Con consulta SQL */
        /* 
        $bajas = Doctrine_Query::create()
                    ->from('Contacto c')
                    ->where('c.id IN (SELECT u.contacto_id FROM PolizaContacto u, Poliza p WHERE u.poliza_id = p.id AND
                              p.estado = "baja" GROUP BY u.contacto_id HAVING COUNT(p.id) = 3)')
                    ->execute();   */
       /* Con objetos */
       /*
       $contactos = Doctrine_Core::getTable('Contacto')->findAll();
       $j = 0;
       foreach ($contactos as $contacto){
            $polizas = $contacto->getPolizas();
            $bajas = 0;
            $totales = 0;
            foreach ($polizas as $poliza) {
               $estado = strtoupper(trim($poliza->getEstado())); 
               if ($estado == "BAJA"){
                   $bajas++;
               }
               $totales++;               
            }
            if ($bajas == $totales){ //Si todas sus pólizas están de baja
                $contactosBajas[$j]=$contacto;
                $j++;
            }
       }
       $clientes = $contactosBajas;    */
       // Con nuevo campo polizasBajas y polizasTotales
       $clientes = Doctrine_Query::create()
                    ->from('Contacto c')
                    ->where('c.PolizasTotales = c.PolizasBajas')
                    ->execute();   
       //$this->redirect('contacto/index');
              
       //Los saco por pdf
       //Cargamos los datos del pdf
	$config = sfTCPDFPluginConfigHandler::loadConfig();
	// pdf object
	$pdf = new sfTCPDF();
	 
	// Variables para generar el documento pdf
	$titulo = sfContext::getInstance()->getI18n()->__('Lista de Clientes de Baja');
	$hoy = $this->getUser()->getAttribute('hoy','Lunes');
	 
	$saltoEncabezado = PDF_HEADER_STRING;
	// set document information
	$pdf->SetCreator(PDF_CREATOR);
	$pdf->SetAuthor(PDF_AUTHOR);
	$pdf->SetTitle($titulo);
	$pdf->SetSubject($titulo);
	$pdf->SetKeywords('acalio, innova, acatec, crm, desarrollo');
	 
	 
	// set default header data
	$pdf->SetHeaderData('../../../../../web/'.sfConfig::get('pdf_imagenlogo'), PDF_HEADER_LOGO_WIDTH,
	$titulo, $saltoEncabezado.$hoy);
	 
	// set header and footer fonts
	$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
	$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
	 
	// set default monospaced font
	$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
	 
	//set margins
	$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT,PDF_MARGIN_BOTTOM);
	$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
	$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
	 
	//set auto page breaks
	$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
	 
	//set image scale factor
	$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
	 
	// ---------------------------------------------------------
	 
	// set default font subsetting mode
	$pdf->setFontSubsetting(true);
	 
	// Set font
	// dejavusans is a UTF-8 Unicode font, if you only need to
	// print standard ASCII chars, you can use core fonts like
	// helvetica or times to reduce file size.
	$pdf->SetFont('dejavusans', '', 6, '', true);
	 
	//Calculo el número de páginas necesarias
        $maximo_pagina = sfConfig::get('app_impresion_max_filas_pagina');
        $numero_clientes = count($clientes);
        $paginas = $numero_clientes/$maximo_pagina;
        if (($numero_clientes%$maximo_pagina)!=0){ //Para la última página
            $paginas = $paginas +1;
        }
        //Voy imprimiendo cada bloque de clientes en una página
        for ($i =1; $i<=$paginas; $i++){
            // Add a page
            // This method has several options, check the source code documentation for more information.
            $pdf->AddPage();
            //Indico además de los clientes, la página por la que voy para que imprima los clientes que corresponden a ese bloque
            $html = $this->imprimeTablaClientesToPdf($clientes,$i);            
            // Print text using writeHTMLCell()
            $pdf->writeHTML($html, true, false, false, false, '');
            // ---------------------------------------------------------
        }
        
	// Close and output PDF document
	// This method has several options, check the source code documentation for more information.
	$pdf->Output($titulo.'.pdf', 'I');
	// Stop symfony process
	throw new sfStopException();
        
  }
  
  /*
   * Muestra formulario con los grupos existentes y crea nuevos.
   */
  public function executeAsignarGrupo()
  {        
     //Cogemos los grupos existentes, pero no los de idioma     
     $dql = Doctrine_Query::create()
  	->from('Grupo g')
        ->where('NOT g.is_validated OR g.is_validated IS NULL');  	     
     
     $grupos = $dql->fetchArray();
     
     //Construyo un array asociativo con los valores y los ids
     $ind=0;
     foreach ($grupos as $grupo)
     {        
        $valores[$grupo['id']] = (string) $grupo['nombre'];
        $ind++;
     }     
     $valores['-1'] = sfContext::getInstance()->getI18n()->__("Crear grupo nuevo");
     
     //Creo el formulario
     $this->form = new BaseForm();
     $this->form->setWidget('grupo', new sfWidgetFormChoice(
                            array(
                                    'choices' => $valores,
                           ))); 
     $this->form->setWidget('nombre', new sfWidgetFormInput(
                            )); 
     
  }
  
  /*
   * Recoge los datos del grupo seleccionado para guardar
   */
  public function executeGuardarAsignacion(sfWebRequest $request)
  {
      $id_grupo = $request->getParameter('grupo');
      if ($id_grupo == "-1"){ //Si he metido un grupo nuevo
          $nombre_grupo = $request->getParameter('nombre');
          if ($nombre_grupo != NULL){
              $grupo = new Grupo();
              $grupo->setNombre($nombre_grupo);
              $grupo->save();
          }          
      }
      else{ //Cojo el grupo de la BD por su id
          $this->forward404Unless($grupo = Doctrine_Core::getTable('Grupo')->find(array($id_grupo)), sprintf('Object contacto does not exist (%s).', $id_grupo));
      }
      if ($grupo != NULL){ //Si el grupo se ha creado bien o existía
       
        //Cojo los ids de los contactos de la sesión
        $ids = $this->getUser()->getAttribute('seleccion_grupos');
        
        if ($ids == NULL){ //Si no realicé selección
            // Coge los que pertenezcan al filtro        
            $ids = array();
            $records = $this->buildQuery()->execute();
            foreach ($records as $record){
               $ids[]= $record->getId(); //Cojo el id del contacto              
            }  
        }         
        
        $grupo_id = $grupo->getId();
        
        //Los asigno al grupo
        //$connection = Doctrine_Manager::getInstance()->getCurrentConnection();
        $connection = Doctrine_Manager::getInstance()->getCurrentConnection()->getDbh();
        $sql = 'INSERT INTO grupo_contacto (contacto_id, grupo_id, created_at, updated_at) VALUES (:contacto_id, :grupo_id, :created_at, :updated_at)';
        $statement = $connection->prepare($sql);
        $mi_fecha = date("Y-m-d");        
        if (is_array($ids)) {
            foreach ($ids as $id) {
                $statement->bindValue(':contacto_id', $id);
                $statement->bindValue(':grupo_id', $grupo_id);                
                $statement->bindValue(':created_at', $mi_fecha);                
                $statement->bindValue(':updated_at', $mi_fecha);                
                $statement->execute();
            }        
        }  
              
        $this->getUser()->setFlash('notice', sfContext::getInstance()->getI18n()->__('Clientes asignados al grupo ').$grupo->getNombre());
      }
      else{          
        $this->getUser()->setFlash('error', sfContext::getInstance()->getI18n()->__('El grupo insertado no es válido'));  
      }
      
      $this->getUser()->getAttributeHolder()->remove('seleccion_grupos'); //Elimino la vble de sesión
      $this->redirect('contacto/index');
  }
  
  protected function processForm(sfWebRequest $request, sfForm $form)
  {
    $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));
    if ($form->isValid())
    {

      $contacto = $form->save();

      $this->getUser()->setFlash('notice', sfContext::getInstance()->getI18n()->__('El cliente '.$this->form->getValue('nombre').' '.
                                                                                                 $this->form->getValue('primer_apellido').' '.
                                                                                                 $this->form->getValue('segundo_apellido').' '.
                                                                                                 'con DNI '.$this->form->getValue('num_documento').
												 ' ha sido guardado'));
      // Hacer solo si viene de nuevo "Guardar y dar de alta vehiculo"
      if ($request->getPostParameter('AddVehiculo') != 0) {
          $this->redirect('vehiculo/new?contacto_id='.$contacto->getId());
      }
      $this->redirect('contacto/index');
    }
  }

  protected function getFilters()
  {
    return $this->getUser()->getAttribute('contacto.filters');
  }

  protected function setFilters(array $filters)
  {
    return $this->getUser()->setAttribute('contacto.filters', $filters);
  }

  protected function getPager()
  {
    //Obtengo el número de contactos a mostrar de la base de datos (tabla CrmConfiguracion)
    // PASAR A TODOS LO MÓDULOS!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!   
    $campo = "numRegistros";
    $q = Doctrine_Query::create()
    ->select('valor')
    ->from('Configuracion c1')
    ->where('c1.campo = ?',$campo);
    $numelementos = $q->fetchOne(array(), Doctrine_Core::HYDRATE_SINGLE_SCALAR);
      
    $pager = new sfDoctrinePager('Contacto', $numelementos);      
    // Ya no lo hacemos por la configuración de symfony, para que el usuario pueda modificarlo.  
    //$pager = new sfDoctrinePager('Contacto', sfConfig::get('app_list_max_contactos'));
    $pager->setQuery($this->buildQuery());
    $pager->setPage($this->getPage());
    $pager->init();

    return $pager;
  }

  protected function setPage($page)
  {
    $this->getUser()->setAttribute('contacto.page', $page);
  }

  protected function getPage()
  {
    return $this->getUser()->getAttribute('contacto.page', 1);
  }

  protected function buildQuery()
  {
    $tableMethod = 'Contacto';
    $filterValues = $this->getFilters();
    $this->valores = $filterValues;
    $borrado = 1;
    //create a default query donde no muestro los marcados para borrar
    $query = Doctrine_Core::getTable('Contacto')->createQuery('p')->where('p.remove_it <> ?',$borrado)
            ->orWhere('p.remove_it IS NULL');//->andWhere('p.contacto_categoria_id = 2');
    
    if (null === $this->filtro)
    {
      $this->filtro = new ContactoFormFilter($filterValues);
    }

    //if the form have been submited
    if($filterValues){
      //bind the values
      $this->filtro->bind($filterValues);
      //if valid, specialise the request using the form
      if($this->filtro->isValid())
         $query = $this->filtro->getQuery();
         //Añado condiciones para que en las búsquedas no se muestren los elementos marcados para borrado
         $query->andWhere($query->getRootAlias().'.remove_it IS NULL OR '.$query->getRootAlias().'.remove_it <> ?',$borrado);
    }    //$query->andWhere($query->getRootAlias().'.contacto_categoria_id = 2');

    $this->addSortQuery($query);

    $event = $this->dispatcher->filter(new sfEvent($this, 'crm.build_query'), $query);
    $query = $event->getReturnValue();
    
    //Controlo que cuando se vaya a imprimir se devuelva el resultado en forma de array, no de objeto
    if ($this->getUser()->getAttribute('imprime') == 1){
       $query->setHydrationMode(Doctrine::HYDRATE_ARRAY);
    }     
    return $query;
  }

  protected function addSortQuery($query)
  {
    if (array(null, null) == ($sort = $this->getSort()))
    {
      return;
    }

    if (!in_array(strtolower($sort[1]), array('asc', 'desc')))
    {
      $sort[1] = 'asc';
    }

    $query->addOrderBy($sort[0] . ' ' . $sort[1]);
  }

  protected function getSort()
  {
    if (null !== $sort = $this->getUser()->getAttribute('contacto.sort'))
    {
      return $sort;
    }

    $this->setSort(array('id',sfConfig::get('app_sort_default','asc')));

    return $this->getUser()->getAttribute('contacto.sort');
  }

  protected function setSort(array $sort)
  {
    if (null !== $sort[0] && null === $sort[1])
    {
      $sort[1] = 'asc';
    }

    $this->getUser()->setAttribute('contacto.sort', $sort);
  }

  protected function isValidSortColumn($column)
  {
    return Doctrine_Core::getTable('Contacto')->hasColumn($column);
  }

  public function executeAjaxClientes($request)
  {
  	$this->getResponse()->setContentType('application/json');

  	$q = "%" . $request->getParameter('term') . "%";

  	$limite = $request->getParameter('limit');
        if (!$limite) $limite=10;
  	// FIXME: use $limit
  	$dql = Doctrine_Query::create()
  	->from('Contacto p')
  	->where('p.nombre LIKE ? OR p.primer_apellido LIKE ? OR p.segundo_apellido LIKE ?', array($q, $q, $q))
        //->andWhere('p.contacto_categoria_id = 2')                
        ->limit($limite);
  	$rows = $dql->fetchArray();
        
        $persons = array();
        $ind=0;
  	foreach ($rows as $row)
  	{
            // {"value":"valor 1","label":"Elemento 1"}
            //$persons[$row['id']] = (string) $row['nombre'];
  	    //if ($row['apellidos']  ) $persons[$row['id']] .= " " . $row['apellidos'];
            $persons[$ind]['id']=$row['id'];
            $persons[$ind]['label']=(string) $row['nombre'];
            if ($row['primer_apellido']  ) $persons[$ind]['label'].= " " . $row['primer_apellido'];
            if ($row['segundo_apellido']  ) $persons[$ind]['label'].= " " . $row['segundo_apellido'];
            $persons[$ind]['value']=(string) $row['nombre'];
            if ($row['primer_apellido']  ) $persons[$ind]['value'].= " " . $row['primer_apellido'];
            if ($row['segundo_apellido']  ) $persons[$ind]['value'].= " " . $row['segundo_apellido'];
            $ind++;
  	}
  	//asort($persons);
  	//Para caracteres mal paridos xDDD
  	return $this->renderText(html_entity_decode(json_encode($persons),ENT_QUOTES,'utf-8'));

  }
  
  public function executeInsertaMail(sfWebRequest $request) 
  {
     $this->form = new BaseForm();
     $this->form->setWidget('email', new sfWidgetFormInput(array()));     
     $id = $request->getParameter('id');
     $this->form->setWidget('id', new sfWidgetFormInputHidden(array('default' => $id)));
      
  }
  
  public function executeSaveMail(sfWebRequest $request) 
  {  
    $this->forward404Unless($request->isMethod(sfRequest::POST) || $request->isMethod(sfRequest::PUT));
    $this->forward404Unless($contacto = Doctrine_Core::getTable('Contacto')->find(array($request->getParameter('id'))), sprintf('Object contacto does not exist (%s).', $request->getParameter('id')));
    
    $contacto->setEmail($request->getParameter('email'));
    $contacto->save();
    
    $this->redirect('notificacion/newMail?id='.$contacto->getId());
  }
  
  public function executeInsertaMailImpago(sfWebRequest $request) 
  {
     $this->form = new BaseForm();
     $this->form->setWidget('email', new sfWidgetFormInput(array()));     
     $id = $request->getParameter('id');
     $this->form->setWidget('id', new sfWidgetFormInputHidden(array('default' => $id)));
      
  }
  
  public function executeSaveMailImpago(sfWebRequest $request) 
  {  
    $this->forward404Unless($request->isMethod(sfRequest::POST) || $request->isMethod(sfRequest::PUT));
    $this->forward404Unless($contacto = Doctrine_Core::getTable('Contacto')->find(array($request->getParameter('id'))), sprintf('Object contacto does not exist (%s).', $request->getParameter('id')));
    
    $contacto->setEmail($request->getParameter('email'));
    $contacto->save();
    
    $this->redirect('notificacion/newImpago?id='.$contacto->getId());
  }

  /*
   * Este método elimina una asignacio contacto-grupo
   */
  public function executeDeleteAsignacion(sfWebRequest $request)
  {
    $request->checkCSRFProtection();
    $grupo_id = $request->getParameter('idG');
    $contacto_id = $request->getParameter('idC');
    
    $q = Doctrine_Query::create()
                            ->delete('GrupoContacto')
                            ->where('contacto_id = ? AND grupo_id = ?', array($contacto_id, $grupo_id));
    $numrows = $q->execute();
    
    if ($numrows != 0){
        $this->getUser()->setFlash('notice', sfContext::getInstance()->getI18n()->__('Asignación grupo-cliente eliminada.'));
    }   
    
    //Vuelvo a la visualización del grupo.
    //NOTA: Se pierde ventana de detrás ????????????????????????????'
    $this->redirect('contacto/show?id='.$contacto_id);
  }
  
  /* Al realizar la impresión de array en lugar de objetos para que vaya más rápido
   * lo implemento en el action en lugar de en el modelo
   * Le paso todos los clientes en forma de array y la página por la que voy imprimiendo
   * para que coja el bloque de clientes que corresponda.
   */
  public function imprimeTablaClientesToPdf($clientes,$pagina){
        
  	// Set some content to print
	$html = 
	'<div><table border="1">
	    <tr style="background-color:#0000FF;color:#FFFFFF;">
                <th colspan="5" align="center"><b>Clientes</b></th>
            </tr>
	    <tr style="background-color:#0000FF;color:#FFFF00;text-align:center">
                <th align="center" style="width:8%"><b>Nombre</b></th>
                <th align="center" style="width:10%"><b>Apellidos</b></th>
                <th align="center" style="width:9%"><b>DNI</b></th>
                <th align="center" style="width:25%"><b>Dirección</b></th>
                <th align="center" style="width:12%"><b>Municipio</b></th>
                <th align="center" style="width:10%"><b>Teléfono</b></th>
                <th align="center" style="width:15%"><b>Email</b></th>
                <th align="center" style="width:5%"><b>Sexo</b></th>
                <th align="center" style="width:6%"><b>Idioma</b></th>
            </tr>';
 	
        //Calculo el primer cliente que debo coger, en función de la página.
	$ind=0; 
        $maximo_pagina = sfConfig::get('app_impresion_max_filas_pagina');       
        $primero = ($maximo_pagina*($pagina-1));        
        
        for ($i=0; $i<$maximo_pagina; $i++)
        {   if ($primero<count($clientes)){ //Para no salirme de rango, porque la última página lo hará más veces de los clientes.
                $cliente = $clientes[$primero];
                $primero++;
                $ind=$ind+1;
                if (($ind % 2) == 0) {
                        $html= $html.'<tr style="background-color:#FFCCCC;">';
                }else{
                $html= $html.'<tr>';
                }
                $html=$html.
                        '<td align="center" valign="middle" style="width:8%">'.$cliente['nombre'].'</td>
                        <td align="center" valign="middle" style="width:10%">'.$cliente['primer_apellido'].' '.$cliente['segundo_apellido'].'</td>    
                        <td align="center" valign="middle" style="width:9%">'.$cliente['num_documento'].'</td>
                        <td align="center" valign="middle" style="width:25%">'.
                            $cliente['tipo_via'].' '.$cliente['direccion'].', '.$cliente['num_via'].', '.$cliente['resto_via'].
                            'Piso '.$cliente['piso'].', Puerta '.$cliente['puerta'].', Escalera '.$cliente['escalera'].', Portal '.$cliente['portal'].'</td>
                        <td align="center" valign="middle" style="width:12%">'.
                            $cliente['municipio'].' ('.$cliente['cod_postal'].') '.$cliente['provincia'].'</td>
                        <td align="center" valign="middle" style="width:10%">'.$cliente['telefono'].' '.$cliente['telefono2'].'</td>
                        <td align="center" valign="middle" style="width:15%">'.$cliente['email'].'</td>
                        <td align="center" valign="middle" style="width:5%">'.$cliente['sexo'].'</td>
                        <td align="center" valign="middle" style="width:6%">'.$cliente['idioma'].'</td>';    
                $html= $html.'</tr>';
            }   
        }
        $html=$html.'</table></div>';
      
    return $html;
  }
  
}
